home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet multimedia / Muzyka / Edytory sampli (probek dzwieku) / ZynAddSubFX_2.2.0 / Setup_ZynAddSubFX-2.2.0.exe / source code / UI / VirKeyboard.fl < prev    next >
Text File  |  2005-03-14  |  12KB  |  401 lines

  1. # data file for the Fltk User Interface Designer (fluid)
  2. version 1.0106 
  3. header_name {.h} 
  4. code_name {.cc}
  5. decl {//Copyright (c) 2002-2005 Nasca Octavian Paul} {} 
  6.  
  7. decl {//License: GNU GPL version 2} {} 
  8.  
  9. decl {\#include <stdlib.h>} {public
  10.  
  11. decl {\#include <FL/fl_draw.H>} {public
  12.  
  13. decl {\#include <FL/Fl_Box.H>} {public
  14.  
  15. decl {\#include "../globals.h"} {public
  16.  
  17. decl {\#include "../Misc/Master.h"} {public
  18.  
  19. decl {\#include "../Input/MidiIn.h"} {public
  20.  
  21. decl {\#include "WidgetPDial.h"} {public
  22.  
  23. decl {const int keyspos[12]={0,-1,1,-2,2,3,-4,4,-5,5,-6,6};} {} 
  24.  
  25. decl {const int keysoct1qw[]={'q','2','w','3','e','r','5','t','6','y','7','u','i','9','o','0','p','[','=',']','\\\\',FL_Enter,0};} {} 
  26.  
  27. decl {const int keysoct2qw[]={'z','s','x','d','c','v','g','b','h','n','j','m',',','l','.',';','/',0};} {} 
  28.  
  29. decl {const int keysoct1dw[]={'\\'','2',',','3','.','p','5','y','6','f','7','g','c','9','r','0','l','/',']','=','\\\\',FL_Enter,0};} {} 
  30.  
  31. decl {const int keysoct2dw[]={';','o','q','e','j','k','i','x','d','b','h','m','w','n','v','s','z',0};} {} 
  32.  
  33. class VirKeys {: {public Fl_Box}
  34. } {
  35.   decl {static const int N_OCT=6;} {}
  36.   decl {static const int SIZE_WHITE=14;} {}
  37.   decl {static const int SIZE_BLACK=8;} {}
  38.   Function {VirKeys(int x,int y, int w, int h, const char *label=0):Fl_Box(x,y,w,h,label)} {} {
  39.     code {master=NULL;} {}
  40.   }
  41.   Function {init(Master *master_)} {} {
  42.     code {master=master_;
  43. for (int i=0;i<N_OCT*12+1;i++) pressed[i]=0;
  44. midich=0;
  45. midivel=100;
  46. midioct=2;
  47.  
  48. keyoct1=3;
  49. keyoct2=2;
  50. rndvelocity=0;} {}
  51.   }
  52.   Function {draw()} {} {
  53.     code {int ox=x(),oy=y(),lx=w(),ly=h()-1,i;
  54.  
  55. if (damage()!=1){
  56.  fl_color(250,240,230);
  57.  fl_rectf(ox,oy,lx,ly);
  58.  
  59.  fl_color(FL_BLACK);
  60.  fl_line(ox,oy,ox+lx,oy);
  61.  fl_line(ox,oy+ly,ox+lx,oy+ly);
  62.  for (i=0;i<N_OCT*7+1;i++){
  63.    fl_line(ox+i*SIZE_WHITE,oy,ox+i*SIZE_WHITE,oy+ly);
  64.    int ik=i%7;
  65.    if ((ik==1)||(ik==2)||(ik==4)||(ik==5)||(ik==6)) 
  66.      fl_rectf(ox+i*SIZE_WHITE-SIZE_BLACK/2,oy,
  67.               SIZE_BLACK+1,ly*3/5);
  68.  };
  69. };
  70.  
  71.  
  72. for (i=0;i<N_OCT*12;i++){
  73.   // if (pressed[i]==0) continue;
  74.  
  75.    int noct=i/12;
  76.    int kv=keyspos[i%12];
  77.  
  78.    if (kv>=0){//white keys
  79.      if (pressed[i]==0) fl_color(250,240,230);
  80.         else fl_color(FL_BLUE);
  81.      fl_rectf(ox+(kv+7*noct)*SIZE_WHITE+3,oy+ly*3/5+2,
  82.        SIZE_WHITE-4,ly*2/5-3);
  83.    } else {//black keys
  84.      kv=keyspos[(i+1)%12];
  85.      if (pressed[i]==0) fl_color(FL_BLACK);
  86.         else fl_color(FL_BLUE);
  87.      fl_rectf(ox+(kv+7*noct)*SIZE_WHITE-SIZE_BLACK/2+2,oy+2,
  88.               SIZE_BLACK-3,ly*3/5-5);
  89.    };
  90. };} {}
  91.   }
  92.   Function {handle(int event)} {return_type int
  93.   } {
  94.     code {int i;
  95. int ly=h();
  96. int x_=Fl::event_x()-x();
  97. int y_=Fl::event_y()-y();
  98. if ( (x_<0)&&(x_>w()) && (y_<0)&&(y_>h())){
  99.   return(0);
  100. };
  101.  
  102.  
  103. if ((event==FL_PUSH)||(event==FL_DRAG)||(event==FL_RELEASE)){
  104.    int kpos=-1;
  105.   
  106.    if (y_>ly*3/5){//white keys
  107.        int pos=x_/SIZE_WHITE;
  108.        if (pos<0) return(1);
  109.        for (i=0;i<12;i++) {
  110.           if (pos%7==keyspos[i]) {
  111.              kpos=pos/7*12+i;
  112.              break;
  113.           };
  114.        };
  115.    } else {//black keys
  116.        int pos=(x_+SIZE_WHITE/2)/SIZE_WHITE;
  117.        if (pos<0) return(1);
  118.        for (i=1;i<12;i++) {
  119.           if (pos%7==-keyspos[i]) {
  120.              kpos=pos/7*12+i;
  121.              break;
  122.           };
  123.        };
  124.    };
  125.  
  126.    if (((event==FL_PUSH)||(event==FL_DRAG))&&
  127.        (Fl::event_shift()==0)) {
  128.         presskey(kpos,1,1);
  129.    };
  130.  
  131.    if ((event==FL_PUSH)&&(Fl::event_shift()!=0)) {
  132.        if (pressed[kpos]==0) presskey(kpos,0,1);
  133.           else relasekey(kpos,1);
  134.    };
  135.    if ((event==FL_RELEASE)&&(Fl::event_shift()==0))
  136.         relaseallkeys(1);
  137.    take_focus();
  138. };
  139.  
  140.  
  141. const int *keysoct1=keysoct1qw;
  142. const int *keysoct2=keysoct2qw;
  143.  
  144. if (config.cfg.VirKeybLayout==2) {
  145.     keysoct1=keysoct1dw;
  146.     keysoct2=keysoct2dw;
  147. };
  148.  
  149. if ((event==FL_KEYDOWN)||(event==FL_KEYUP)){
  150.    int key=Fl::event_key();
  151.    int kpos=-1;
  152.    for (i=0;keysoct1[i]!=0;i++) if (key==keysoct1[i]) kpos=i+12*keyoct1;
  153.    for (i=0;keysoct2[i]!=0;i++) if (key==keysoct2[i]) kpos=i+12*keyoct2;
  154.  
  155.    if (kpos==-1) return(0);
  156.    if (event==FL_KEYDOWN) presskey(kpos,0,2);
  157.       else relasekey(kpos,2);
  158. };
  159.  
  160. return(1);} {}
  161.   }
  162.   Function {presskey(int nk,int exclusive,int type)} {} {
  163.     code {if (nk>=N_OCT*12) return;
  164. if ((nk<0)&&(exclusive==0)) {
  165.   relaseallkeys(type);
  166.   return;
  167. };
  168. if (pressed[nk]!=0) return;//the key is already pressed
  169.  
  170. if (exclusive!=0) relaseallkeys(type);
  171. pressed[nk]=type;
  172.  
  173. damage(1);
  174. float vel=midivel;
  175. if (rndvelocity!=0){
  176.   vel=midivel*(127.0-rndvelocity)/127.0+RND*rndvelocity;
  177. };
  178.  
  179. pthread_mutex_lock(&master->mutex);
  180.  master->NoteOn(midich,nk+midioct*12,(int)vel);
  181. pthread_mutex_unlock(&master->mutex);} {}
  182.   }
  183.   Function {relasekey(int nk,int type)} {} {
  184.     code {if ((nk<0)||(nk>=N_OCT*12)) return;
  185. if (pressed[nk]==0) return;//the key is not pressed
  186. if ((type!=0)&&(pressed[nk]!=type)) return;
  187.  
  188. pressed[nk]=0;
  189.  
  190.  
  191. damage(1);
  192.  
  193. pthread_mutex_lock(&master->mutex);
  194.  master->NoteOff(midich,nk+12*midioct);
  195. pthread_mutex_unlock(&master->mutex);} {}
  196.   }
  197.   Function {relaseallkeys(int type)} {} {
  198.     code {for (int i=0;i<N_OCT*12;i++) relasekey(i,type);} {}
  199.   }
  200.   decl {Master *master;} {}
  201.   decl {int pressed[N_OCT*12+1];} {}
  202.   decl {unsigned char midich;} {public
  203.   }
  204.   decl {unsigned char midivel;} {public
  205.   }
  206.   decl {char midioct,keyoct1,keyoct2;} {public
  207.   }
  208.   decl {unsigned char rndvelocity;} {public
  209.   }
  210.  
  211. class VirKeyboard {selected
  212. } {
  213.   Function {make_window()} {} {
  214.     Fl_Window virkeyboardwindow {
  215.       label {Virtual Keyboard - ZynAddSubFX}
  216.       callback {relaseallkeys();
  217. virkeyboardwindow->hide();}
  218.       xywh {95 563 650 130} type Double hide
  219.     } {
  220.       Fl_Box virkeys {
  221.         label Keyboard
  222.         xywh {10 10 590 80} box FLAT_BOX color 17
  223.         code0 {o->init(master);}
  224.         class VirKeys
  225.       }
  226.       Fl_Counter {} {
  227.         label {"qwer.." Oct}
  228.         callback {relaseallkeys();
  229. virkeys->keyoct1=(int) o->value();
  230. virkeys->take_focus();}
  231.         tooltip {keys "q2w3er5t6y..." octave} xywh {380 95 45 15} type Simple labelsize 10 align 4 when 6 minimum 0 maximum 5 step 1 textfont 1 textsize 10
  232.         code0 {o->value(virkeys->keyoct1);}
  233.       }
  234.       Fl_Counter {} {
  235.         label {"zxcv.." Oct}
  236.         callback {relaseallkeys();
  237. virkeys->keyoct2=(int) o->value();
  238. virkeys->take_focus();}
  239.         tooltip {keys "zsxdcvgbh..." octave} xywh {380 110 45 15} type Simple labelsize 10 align 4 when 6 minimum 0 maximum 5 step 1 textfont 1 textsize 10
  240.         code0 {o->value(virkeys->keyoct2);}
  241.       }
  242.       Fl_Value_Slider {} {
  243.         label Vel
  244.         callback {virkeys->midivel=(int) o->value();
  245. virkeys->take_focus();}
  246.         tooltip Velocity xywh {95 105 100 15} type {Horz Knob} box FLAT_BOX labelsize 10 align 5 minimum 1 maximum 127 step 1
  247.         code0 {o->value(virkeys->midivel);}
  248.       }
  249.       Fl_Counter {} {
  250.         label {Oct.}
  251.         callback {relaseallkeys();
  252. virkeys->midioct=(int) o->value();
  253. virkeys->take_focus();}
  254.         tooltip {Midi Octave} xywh {255 100 55 20} type Simple labelsize 12 align 4 when 6 minimum 0 maximum 5 step 1 textfont 1 textsize 12
  255.         code0 {o->value(virkeys->midioct);}
  256.       }
  257.       Fl_Button {} {
  258.         label Close
  259.         callback {relaseallkeys();
  260. virkeyboardwindow->hide();}
  261.         xywh {545 105 55 20} box THIN_UP_BOX
  262.       }
  263.       Fl_Value_Slider {} {
  264.         label Cval
  265.         callback {int ctl=midictl;
  266.  
  267. pthread_mutex_lock(&master->mutex);
  268.  master->SetController(virkeys->midich,ctl,(int) o->value());
  269. pthread_mutex_unlock(&master->mutex);
  270. virkeys->take_focus();}
  271.         tooltip {Controller value} xywh {605 10 15 115} type {Vert Fill} box ENGRAVED_BOX selection_color 229 labelsize 8 align 5 minimum 127 maximum 0 step 1 value 64 textsize 7
  272.       }
  273.       Fl_Choice {} {
  274.         label Controller
  275.         callback {switch((int) o->value()+1){
  276.    case 1: midictl=C_modwheel; break;
  277.    case 2: midictl=C_volume; break;
  278.    case 3: midictl=C_panning; break;
  279.    case 4: midictl=C_expression; break;
  280.    case 5: midictl=C_sustain; break;
  281.    case 6: midictl=C_portamento; break;
  282.    case 7: midictl=C_filterq; break;
  283.    case 8: midictl=C_filtercutoff; break;
  284.    case 9: midictl=C_bandwidth; break;
  285.    case 10: midictl=C_fmamp; break;
  286.    case 11: midictl=C_resonance_center; break;
  287.    case 12: midictl=C_resonance_bandwidth; break;
  288.    default: midictl=C_NULL; break;
  289.  
  290. };
  291.  
  292.  
  293.  
  294. virkeys->take_focus();}
  295.         xywh {435 105 100 15} down_box BORDER_BOX labelsize 10 align 5 when 6 textfont 1 textsize 10
  296.         code0 {midictl=C_filtercutoff;o->value(7);}
  297.       } {
  298.         menuitem {} {
  299.           label {01: Mod.Wheel}
  300.           xywh {0 0 100 20} labelfont 1 labelsize 10
  301.         }
  302.         menuitem {} {
  303.           label {07: Volume}
  304.           xywh {10 10 100 20} labelfont 1 labelsize 10
  305.         }
  306.         menuitem {} {
  307.           label {10: Panning}
  308.           xywh {20 20 100 20} labelfont 1 labelsize 10
  309.         }
  310.         menuitem {} {
  311.           label {11: Expression}
  312.           xywh {30 30 100 20} labelfont 1 labelsize 10
  313.         }
  314.         menuitem {} {
  315.           label {64: Sustain}
  316.           xywh {40 40 100 20} labelfont 1 labelsize 10
  317.         }
  318.         menuitem {} {
  319.           label {65: Portamento}
  320.           xywh {50 50 100 20} labelfont 1 labelsize 10
  321.         }
  322.         menuitem {} {
  323.           label {71: Filter Q}
  324.           xywh {60 60 100 20} labelfont 1 labelsize 10
  325.         }
  326.         menuitem {} {
  327.           label {74: Filter Freq.}
  328.           xywh {70 70 100 20} labelfont 1 labelsize 10
  329.         }
  330.         menuitem {} {
  331.           label {75: Bandwidth}
  332.           xywh {80 80 100 20} labelfont 1 labelsize 10
  333.         }
  334.         menuitem {} {
  335.           label {76: FM Gain}
  336.           xywh {90 90 100 20} labelfont 1 labelsize 10
  337.         }
  338.         menuitem {} {
  339.           label {77: Res. c. freq}
  340.           xywh {100 100 100 20} labelfont 1 labelsize 10
  341.         }
  342.         menuitem {} {
  343.           label {78: Res. bw.}
  344.           xywh {110 110 100 20} labelfont 1 labelsize 10
  345.         }
  346.       }
  347.       Fl_Roller pitchwheelroller {
  348.         label Pwh
  349.         callback {pthread_mutex_lock(&master->mutex);
  350.  master->SetController(virkeys->midich,C_pitchwheel,-(int) o->value());
  351. pthread_mutex_unlock(&master->mutex);
  352. virkeys->take_focus();}
  353.         tooltip {Pitch Wheel} xywh {625 10 20 95} box PLASTIC_UP_BOX labelsize 8 align 1 when 3 minimum -8192 maximum 8192 step 64
  354.       }
  355.       Fl_Button {} {
  356.         label R
  357.         callback {pitchwheelroller->value(0);
  358. pitchwheelroller->do_callback();}
  359.         tooltip {Reset Pitch Bend} xywh {625 110 20 15} box THIN_UP_BOX labelfont 1
  360.       }
  361.       Fl_Dial {} {
  362.         label Vrnd
  363.         callback {virkeys->rndvelocity=(int) o->value();}
  364.         tooltip {Velocity Randomness} xywh {205 105 20 20} box ROUND_UP_BOX labelsize 10 align 129 maximum 127 step 1
  365.         code0 {o->value(virkeys->rndvelocity);}
  366.         class WidgetPDial
  367.       }
  368.       Fl_Choice partrcv {
  369.         label {MIDI Ch.}
  370.         callback {relaseallkeys();
  371. virkeys->midich=(int) o->value();
  372. virkeys->take_focus();} open
  373.         tooltip {Send to Midi Channel} xywh {20 105 65 20} down_box BORDER_BOX labelsize 10 align 5 textfont 1 textsize 10
  374.         code0 {char nrstr[10]; for(int i=0;i<NUM_MIDI_CHANNELS;i++){sprintf(nrstr,"Chn%d",i+1);if (i!=9) o->add(nrstr); else o->add("Drum10");};}
  375.         code1 {o->value(virkeys->midich);}
  376.       } {}
  377.     }
  378.   }
  379.   Function {VirKeyboard(Master *master_)} {} {
  380.     code {master=master_;
  381. midictl=75;
  382. make_window();} {}
  383.   }
  384.   Function {show()} {} {
  385.     code {virkeyboardwindow->show();} {}
  386.   }
  387.   Function {relaseallkeys()} {} {
  388.     code {virkeys->relaseallkeys(0);} {}
  389.   }
  390.   decl {Master *master;} {}
  391.   decl {int midictl;} {}
  392.